"""
类方法特点：
        · 需要用砖时期@classmethod 来表示其为类方法，对于类方法，第一个参数必须是类对象，一般以cls作为第一个参数
    类方法使用场景：
        · 当方法中 需要使用类对象(如访问私有类属性等)时，定义类方法
        · 类方法一般和类属性配合使用

静态方法特点：
        · 需要通过转时期@staticmethod 来进行修饰，静态方法几不需要传递类对象，也不需要传递实例对象(形参没有self/cls)
        · 静态方法 也能够通过实例对象和类对象去访问
    静态方法使用场景：
        · 当方法中挤不下粗腰使用实例对象(如实例对象、实例属性)。也不需要实用类对象(如类属性、类方法、创建实例等)时，定义静态方法
        · 取消不需要的参数传递，有利于减少不必要的内纯占用和性能消耗
"""

# 定义一个类
class Dog:
    # 设置类属性
    tooth = 10

    # 实例属性
    def __init__(self,name):
        self.name = name

    # 定义一个实列方法
    def get_name(self):
        print(f"我的名字是：{self.name}")

    # 定义一个类方法
    @classmethod
    def get_tooh(cls):
        print(f"狗类一共有：{Dog.tooth}颗牙齿")

    # 定义一个静态方法:无参数
    @staticmethod
    def print_info():
        print("这是一个创建狗的类")

    # 静态方法：有参数
    @staticmethod
    def sum_fun(x, y):
        print(x+y)


wangcai = Dog("旺财")
laifu = Dog("来福")

#调用实例方法：
# 实例对象可以直接调用实例方法， 会触发自动传参，把自己当第一个参数传递给self
wangcai.get_name()  # 我的名字是：旺财
# 类的调用实例方法：不会自动传参，序手动传递一个实例对象个参数self
Dog.get_name(laifu) # 我的名字是：来福

# 调用类方法：
# 类可以直接调用类方法
Dog.get_tooh()  # 狗类一共有：10颗牙齿
# 实例对象也可以调用类方法
wangcai.get_tooh()
# laifu啃骨头累掉了2颗牙齿
laifu.tooth = 8
laifu.get_tooh()  # # 狗类一共有：10颗牙齿    来福累掉了2颗牙齿，跟狗类有什么关系？

# 调用静态方法：类和实例对象都可以直接调用，不会触发自动传参
# 类调用
Dog.print_info()    # 这是一个创建狗的类
# 实例调用
wangcai.print_info()    # 这是一个创建狗的类

# 静态方法有参数的
Dog.sum_fun(1,12)